﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SegIdenMovil.Entidad;
using SegIdenMovil.Herramientas;
using GS1.Library;
using SegIdenMovil.Delegate;

namespace SegIdenMovil
{
    public partial class frmRecImpBulto : Form
    {
        #region --- Variables y Constantes ---
        public Guia guia { get; set; }

        public OrdenCompra ordenCompra { get; set; }

        private ListaBulto listaBulto = null;

        private const int INDICE_COLUMNA_PRODUCTO_DESCRIPCION = 2;
        private const int INDICE_COLUMNA_CANTIDAD_RECIBIR = 3;
        private const int INDICE_COLUMNA_CANTIDAD_ATENDIENDO = 4;
        #endregion

        #region --- Constructor ---
        public frmRecImpBulto()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmRecImpBulto_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void frmRecImpBulto_Closing(object sender, CancelEventArgs e)
        {
            activarScanner(false);
        }

        private void btnCapturaCodigo_Click(object sender, EventArgs e)
        {
            this.txtNumeroBulto.Text = "123456789";
        }

        private void btnAgregarItems_Click(object sender, EventArgs e)
        {
            agregar();
        }

        private void mnuGuardar_Click(object sender, EventArgs e)
        {
            guardar();
        }

        private void mnuSalir_Click(object sender, EventArgs e)
        {
            salir(DialogResult.Cancel);
        }

        private void lvwListado_DoubleClick(object sender, EventArgs e)
        {
            if (!this.lvwListado.Focused) { return; }
            string codigoProducto = string.Empty;
            Producto producto = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Obteniendo codigo del producto a mostrar su imagen
                codigoProducto = this.lvwListado.Items[this.lvwListado.SelectedIndices[0]].Text;
                producto = obtenerProductoyComponentes(codigoProducto);

                if (producto != null)
                {
                    if (!producto.imagen.Equals(string.Empty))
                    {
                        using (frmProductoImagen frmProductoImagen = new frmProductoImagen())
                        {
                            frmProductoImagen.imagenProducto = producto.imagen.base64ToImage();
                            frmProductoImagen.ShowDialog();
                        }
                    }
                    else
                    {
                        Util.ShowMessageboxExclamacion("El producto seleccionado no tiene una imagen asignada.");
                    }
                }
                else
                {
                    Util.ShowMessageboxExclamacion("No se encontro los datos del producto seleccionado.");
                }
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        #endregion

        #region --- Metodo y Evento Scanner ---
        private void activarScanner(bool estado)
        {
            if (estado)
            {
                if (ParametrosAplicacion.scanner == null) { ParametrosAplicacion.scanner = new GS1.Scanner.Scan(this); }
                ParametrosAplicacion.scanner.EscanearDato += new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                ParametrosAplicacion.scanner.ActivarScan();
            }
            else
            {
                if (ParametrosAplicacion.scanner != null)
                {
                    ParametrosAplicacion.scanner.EscanearDato -= new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                    if (ParametrosAplicacion.scanner.IsActive) { ParametrosAplicacion.scanner.DesActivarScan(); }
                }
            }
        }

        private void scanner_EscanearDato(string pTipo, string pDato)
        {
            // Estableciendo codigo de barras leido
            this.txtNumeroBulto.Text = pDato;
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                // Se agrega muestra el detalle de OC
                this.lvwListado.BeginUpdate();
                this.lvwListado.Items.Clear();

                // Instanciando listado de bultos
                this.listaBulto = new ListaBulto();

                ListViewItem nuevoItem = null;

                // Cuando lineas de la orden de compra
                foreach (LineaOrdenCompra lineaOrdenCompra in this.ordenCompra.listaLineaOrdenCompra.lista)
                {
                    nuevoItem = new ListViewItem(lineaOrdenCompra.producto.codigo);
                    nuevoItem.SubItems.Add(lineaOrdenCompra.producto.codProductoProveedor);
                    nuevoItem.SubItems.Add(lineaOrdenCompra.producto.descripcion);
                    nuevoItem.SubItems.Add(lineaOrdenCompra.cantidad);
                    nuevoItem.SubItems.Add(lineaOrdenCompra.cantidadRecibidaOriginalmente);

                    this.lvwListado.Items.Add(nuevoItem);
                }

                this.lvwListado.EndUpdate();

                // Se aplica estilo a listview
                //opcion para ver imagen
                Utilitario.aplicarEstiloGrilla(this.lvwListado, this, 
                                               lvwListado_DoubleClick);

                activarScanner(true);
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarEntradaLista()
        {
            int totalSeleccionados = this.lvwListado.SelectedIndices.Count;

            if (this.txtNumeroBulto.Text.Equals(string.Empty))
            {
                Util.CampoNecesario(this.txtNumeroBulto, "Debe leer o ingresar el número del bulto", this.Text);
                return true;
            }

            if (totalSeleccionados <= 0)
            {
                Util.CampoNecesario(this.lvwListado, "Debe selecionar un documento a atender", this.Text);
                return true;
            }

            return false;
        }

        private void agregar()
        {
            int indiceFilaSeleccionada = 0;
            LineaOrdenCompra lineaOrdenCompraAtender = null;
            string descripcionProducto = string.Empty;
            int cantidadARecibir = 0;
            int cantidadAtendida = 0;
            int cantidadRecibida = 0;

            try
            {
                if (validarEntradaLista()) { return; }

                // Obteniendo indice de fila seleccionado
                indiceFilaSeleccionada = this.lvwListado.SelectedIndices[0];

                // Obteniendo linea de orden compra
                lineaOrdenCompraAtender = this.ordenCompra.listaLineaOrdenCompra.lista[indiceFilaSeleccionada];

                // Validar si la linea es de venta directa, si es asi entonces salir
                //if (lineaOrdenCompraAtender.ventaDirecta.Equals(Constantes.SI))
                //{
                //    Util.ShowMessageboxExclamacion("No se puede recibir el producto seleccionado" + Environment.NewLine +
                //                                   "Por ser de venta directa", this.Text);
                //    return;
                //}

                // Obteniendo la descripcion del prodcuto por la linea seleccionada
                descripcionProducto = this.lvwListado.Items[indiceFilaSeleccionada].SubItems[INDICE_COLUMNA_PRODUCTO_DESCRIPCION].Text;

                // Obteniendo la cantidad a recibir por la linea seleccionada
                cantidadARecibir = Convert.ToInt32(this.lvwListado.Items[indiceFilaSeleccionada].SubItems[INDICE_COLUMNA_CANTIDAD_RECIBIR].Text);

                // Obteniendo la cantidad de items recibidos por la linea seleccionada
                cantidadAtendida = Convert.ToInt32(this.lvwListado.Items[indiceFilaSeleccionada].SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text);

                // Validar si se puede atender el producto seleccionado
                if (cantidadARecibir.Equals(cantidadAtendida))
                {
                    Util.ShowMessageboxExclamacion("Ya se recibio todo los items del producto:" +
                                                   descripcionProducto, this.Text);
                    return;
                }

                // Obteniedo fila seleccionad del listado
                indiceFilaSeleccionada = this.lvwListado.SelectedIndices[0];

                // Obtener los datos del producto a atender 
                Producto productoAtender = obtenerProducto(lineaOrdenCompraAtender.producto);

                if (productoAtender == null) { return; }

                // Declando variable bulto a crear
                Bulto bulto = null;
                bool encontrado = false;

                // Buscar en bultos ya ha sido creado
                bulto = buscarBulto(this.txtNumeroBulto.Text);
                encontrado = bulto != null;

                // Si no existe en el listado entonces crear uno nuevo
                if (!encontrado)
                {
                    bulto = new Bulto();
                    bulto.codGuia = this.guia.codGuia;
                    bulto.SSCC = this.txtNumeroBulto.Text;
                    bulto.totalItems = 1;
                    bulto.estado = Constantes.ESTADO_BULTO_PENDIENTE;
                }

                // Estableciendo el usuario que esta creando el bulto
                bulto.usuario = new Usuario { codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario };
                bulto.tienda = new Tienda { codigo = ParametrosAplicacion.TIENDA_ACTUAL.codigo };

                using (frmRecImpDocItemAvance frmRecImpDocItemAvance = new frmRecImpDocItemAvance())
                {
                    frmRecImpDocItemAvance.guia = this.guia;
                    frmRecImpDocItemAvance.ordenCompra = this.ordenCompra;
                    frmRecImpDocItemAvance.lineaOrdenCompra = lineaOrdenCompraAtender;
                    frmRecImpDocItemAvance.producto = productoAtender;

                    if (bulto.listaItem != null)
                    {
                        frmRecImpDocItemAvance.listaItemCargados = bulto.listaItem;
                    }
                    else
                    {
                        frmRecImpDocItemAvance.listaItemCargados = new ListaItem();
                        frmRecImpDocItemAvance.cantidadPendienteRecibir = (cantidadARecibir - cantidadAtendida);
                    }

                    if (productoAtender.componentes.Equals(Constantes.SI))
                    {
                        foreach (LineaGuia lineaGuia in this.guia.listaLineaGuia.lista)
                        {
                            foreach (LineaGuiaItem lineaGuiaItem in lineaGuia.listaLineaGuiaItem.lista)
                            {
                                if (lineaGuiaItem.item.producto.codigo.Equals(productoAtender.codigo))
                                {
                                    if (lineaGuiaItem.item.estado.Equals(Constantes.ESTADO_ITEM_RECEPCION_PARCIAL))
                                    {
                                        frmRecImpDocItemAvance.itemComponentes = obtenerItem(lineaGuiaItem.item);
                                    }
                                }

                            }
                        }
                    }

                    if (frmRecImpDocItemAvance.ShowDialog() == DialogResult.Cancel) { frmRecImpDocItemAvance.Dispose(); return; }

                    cantidadRecibida = frmRecImpDocItemAvance.cantidadRecibida;
                    this.ordenCompra.listaLineaOrdenCompra.lista[indiceFilaSeleccionada].cantidadRecibida =
                        (Convert.ToInt32(this.ordenCompra.listaLineaOrdenCompra.lista[indiceFilaSeleccionada].cantidadRecibida) + cantidadRecibida).ToString();
                    
                    //Agrega linea y detalle de guia si 
                    Boolean productoNuevo = true;
                    int numeroLinea = 1;
                    foreach (LineaGuia lineaGuia in this.guia.listaLineaGuia.lista)
                    {
                        if (lineaGuia.producto.codigo.Equals(productoAtender.codigo))
                        {
                            productoNuevo = false;
                            lineaGuia.cantidad = this.ordenCompra.listaLineaOrdenCompra.lista[indiceFilaSeleccionada].cantidadRecibida;
                            foreach (Item item in frmRecImpDocItemAvance.listaItem.lista)
                            {
                                if (item.codItem.Equals(Constantes.VALOR_CERO))
                                {
                                    LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                                    lineaGuiaItem.codGuia = this.guia.codGuia;
                                    lineaGuiaItem.item = item;
                                    lineaGuiaItem.nroLinea = lineaGuia.numeroLinea;
                                    lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);
                                }
                            }
                        }
                        numeroLinea++;
                    }

                    if (productoNuevo)
                    {
                        LineaGuia lineaGuiaNueva = new LineaGuia();
                        lineaGuiaNueva.codGuia = this.guia.codGuia;
                        lineaGuiaNueva.producto = productoAtender;
                        lineaGuiaNueva.numeroLinea = numeroLinea.ToString();
                        lineaGuiaNueva.cantidad = this.ordenCompra.listaLineaOrdenCompra.lista[indiceFilaSeleccionada].cantidadRecibida;
                        lineaGuiaNueva.listaLineaGuiaItem = new ListaLineaGuiaItem();
                        foreach (Item item in frmRecImpDocItemAvance.listaItem.lista)
                        {
                            LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                            lineaGuiaItem.codGuia = this.guia.codGuia;
                            lineaGuiaItem.item = item;
                            lineaGuiaItem.nroLinea = lineaGuiaNueva.numeroLinea;
                            lineaGuiaNueva.listaLineaGuiaItem.add(lineaGuiaItem);
                        }
                        this.guia.listaLineaGuia.add(lineaGuiaNueva);
                    }

                    // Validar si el bulto es nuevo
                    if (bulto.listaItem == null)
                    {
                        // Si es nuevo establecer el nuevo listado de items
                        bulto.listaItem = frmRecImpDocItemAvance.listaItem;
                    }
                    else
                    {
                        // Si no es nuevo agregar los items al listado
                        foreach (Item item in frmRecImpDocItemAvance.listaItem.lista)
                        {
                            bulto.listaItem.add(item);
                        }
                    }

                    frmRecImpDocItemAvance.Dispose();
                }
                //se asegura que en el campo se mantenga el dato del codigo del bulto
                this.txtNumeroBulto.Text = bulto.SSCC;

                // Reestableciendo el total de items recibido en el bulto
                bulto.totalItems = bulto.listaItem.size();

                // Incrementando la cantidad atendida con la recibida en el bulto
                cantidadAtendida += cantidadRecibida;

                // Actualizando linea seleccionada
                this.lvwListado.Items[indiceFilaSeleccionada].SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text = cantidadAtendida.ToString();

                // Actualizar el color de la fila seleccionada
                this.lvwListado.Items[indiceFilaSeleccionada].BackColor = (cantidadARecibir == cantidadAtendida) ? Color.Green : Color.Yellow;

                // Agregando bulto a la lista de bultos creados y sino existe
                if (!encontrado)
                {
                    this.listaBulto.add(bulto);
                }

            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
        }

        private bool validarEntrada()
        {
            bool resultado = false;

            if ( (this.listaBulto == null) || (this.listaBulto.size() < 1) )
            {
                Util.ShowMessageboxInfo("Debe recibir por lo menos un bulto para guardar", this.Text);
                return true;
            }

            return resultado;
        }

        private void validarOrdenCompra()
        {
            bool ocEstaCompleta = true;

            foreach (LineaOrdenCompra lineaOrdenCompra in this.ordenCompra.listaLineaOrdenCompra.lista)
            {
                if (Convert.ToInt32(lineaOrdenCompra.cantidad) > Convert.ToInt32(lineaOrdenCompra.cantidadRecibida))
                {
                    ocEstaCompleta = false;
                    break;
                }
            }

            //Valida el estado de la orden de compra si se ha completado
            this.ordenCompra.estado = ocEstaCompleta ? Constantes.ESTADO_OC_RECEPCIONADO : Constantes.ESTADO_OC_PENDIENTE;
           
            //buscar en guia.listaOrdenCompra si la OC ya existe
            foreach (OrdenCompra ordenCompraLeer in this.guia.listaOrdenCompra.lista)
            {
                if (this.ordenCompra.codOC.Equals(ordenCompraLeer.codOC))
                {
                    this.guia.listaOrdenCompra.remove(ordenCompraLeer);
                    break;
                }
            }

            //Agrega la orden de compra a la lista 
            this.guia.listaOrdenCompra.add(this.ordenCompra);

            // Instanciando lista de linea de bultos
            ListaLineaGuiaBulto listaLineaGuiaBulto = new ListaLineaGuiaBulto();
            foreach (Bulto bulto in this.listaBulto.lista)
            {
                bulto.codGuia = this.guia.codGuia;
                listaLineaGuiaBulto.add(new LineaGuiaBulto { codGuia = this.guia.codGuia, bulto = bulto });
            }

            // Estableciendo lista de linea guia bulto
            this.guia.listaLineaGuiaBulto = listaLineaGuiaBulto;

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_PROCESO_IMPORTACION;
            operacion.guia = this.guia;

            // Instanciando y ejecutando llamada al ServicioREST
            using (ConexionREST conexionREST = new ConexionREST())
            {
                contenidoXML = conexionREST.ejecutarOperacion(operacion);
            }

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Util.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

            if ((operacionResultado != null) &&
                (operacionResultado.esOK.Equals(Constantes.SI)))
            {
                // Instanciando y ejecutando llamada al ServicioLocal
                using (ConexionLocal conexionLocal = new ConexionLocal())
                {
                    conexionLocal.actualizar(this.ordenCompra);
                }

                Util.ShowMessageboxInfo("Bulto guardado correctamente");
                //Graba detalle de la guia
                //grabaGuiaDetalle();
            }
            else
            {
                Util.ShowMessageboxError("No se guardo los datos");
                return;
            }
        }

        private void grabaGuiaDetalle()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;
            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_DETALLE_ACTUALIZAITEM;
                foreach (LineaGuia lineaguia in this.guia.listaLineaGuia.lista)
                {
                    foreach (LineaGuiaItem lineaGuiaItem in lineaguia.listaLineaGuiaItem.lista)
                    {
                        if (lineaGuiaItem.item.codItem.Equals(Constantes.VALOR_CERO) ||
                            lineaGuiaItem.item.codItem == null)
                        {
                            if (lineaGuiaItem.item.listaItemComponente != null)
                            {
                                Item itembuscar = consultarItem(lineaGuiaItem.item.listaItemComponente.lista[0].codificacion);
                                lineaGuiaItem.item.codItem = itembuscar.codItem;
                            }
                            else
                            {
                                Item itembuscar = consultarItem(lineaGuiaItem.item.codificacion);
                                lineaGuiaItem.item.codItem = itembuscar.codItem;
                            }
                        }
                    }
                }

                operacion.guia = this.guia;

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Util.ShowMessageboxInfo("Guia guardado correctamente");
                }
                else
                {
                    Util.ShowMessageboxError("No se guardo los datos");
                    return;
                }


            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }

        }

        private Item consultarItem(String itemCodificacion)
        {
            Item itembuscar = null;
            Operacion operacion = null;
            string contenidoXML = string.Empty;
            
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_CONSULTAR_ITEM;

                operacion.item = new Item();
                operacion.item.codificacion = itemCodificacion;

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return null;
                }

                // Obteniendo Producto
                itembuscar = contenidoXML.DeserializarTo<Item>();

                if (itembuscar == null) { Util.ShowMessageboxExclamacion("Item no encontrado.", this.Text); }
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

            return itembuscar;
        }

        private Item obtenerItem(Item item)
        {
            Item itembuscar = null;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_ITEM;

                operacion.item = new Item();
                operacion.item.codItem = item.codItem;

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return null;
                }

                // Obteniendo Producto
                itembuscar = contenidoXML.DeserializarTo<Item>();

                if (itembuscar == null) { Util.ShowMessageboxExclamacion("Item no encontrado.", this.Text); }
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

            return itembuscar;
        }

        private void guardar()
        {

            try
            {
                if (validarEntrada()) { return; }

                if (!Util.ShowMessageboxPregunta("¿Esta seguro de guardar la recepción?")) { return; }

                Cursor.Current = Cursors.WaitCursor;
                
                // Estableciendo guia y ordenes de compra
                //validarGuia();

                // Grabar Ordenes de Compra
                validarOrdenCompra();

                salir(DialogResult.OK);
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private Bulto buscarBulto(string ssccBulto)
        {
            foreach (Bulto bulto in this.listaBulto.lista)
            {
                if (bulto.SSCC.Equals(ssccBulto))
                {
                    return bulto;
                }
            }

            return null;
        }

        private Producto obtenerProducto(Producto producto)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;
            Producto productoObtenido = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_PRODUCTO;

                operacion.producto = new Producto();
                operacion.producto = producto;
                operacion.producto.codigo = producto.codigo;
                operacion.tienda = new Tienda();
                operacion.tienda = ParametrosAplicacion.TIENDA_ACTUAL;

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return null;
                }

                // Obteniendo Producto
                productoObtenido = contenidoXML.DeserializarTo<Producto>();

                if (productoObtenido == null) { Util.ShowMessageboxExclamacion("Producto no encontrado.", this.Text); }
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

            return productoObtenido;
        }

        private void salir(DialogResult resultado)
        {
            this.DialogResult = resultado;
        }

        private Producto obtenerProductoyComponentes(string codigoProducto)
        {
            Producto producto = null;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_PRODUCTO;
            operacion.producto = new Producto { codigo = codigoProducto };

            operacion.tienda = new Tienda();
            operacion.tienda = ParametrosAplicacion.TIENDA_ACTUAL;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Util.ShowMessageboxError(operacionError.descripcion);
                return null;
            }

            // Obteniendo Objeto de Producto
            producto = contenidoXML.DeserializarTo<Producto>();

            return producto;
        }

        private void txtNumeroBulto_TextChanged(object sender, EventArgs e)
        {

        }

        private void label2_ParentChanged(object sender, EventArgs e)
        {

        }



        #region --- Codigo Comentado ---

        //private void guardarGuia()
        //{
        //    Operacion operacion = null;
        //    string contenidoXML = string.Empty;

        //    // Estableciendo operacion a ser enviada al Servicio REST
        //    operacion = new Operacion();
        //    operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_IMPORTACION;
        //    operacion.guia = this.guia;

        //    // Instanciando y ejecutando llamada al ServicioREST
        //    using (ConexionREST conexionREST = new ConexionREST())
        //    {
        //        contenidoXML = conexionREST.ejecutarOperacion(operacion);
        //    }

        //    // Obteniendo Objeto de Error
        //    OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

        //    // Validar si hay error
        //    if (operacionError != null)
        //    {
        //        Util.ShowMessageboxError(operacionError.descripcion);
        //        return;
        //    }

        //    OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

        //    if ((operacionResultado != null) &&
        //        (operacionResultado.esOK.Equals(Constantes.SI)))
        //    {
        //        Util.ShowMessageboxInfo("Guia guardado correctamente");
        //        this.guia.codGuia = operacionResultado.codigoGenerado;
        //    }
        //    else
        //    {
        //        Util.ShowMessageboxError("No se guardo los datos");
        //        return;
        //    }
        //}

        //private void validarGuia()
        //{
        //    Operacion operacion = null;
        //    string contenidoXML = string.Empty;

        //    Cursor.Current = Cursors.WaitCursor;

        //    // Estableciendo operacion a ser enviada al Servicio REST
        //    operacion = new Operacion();
        //    operacion.numero = Constantes.OPERACION_VALIDAR_GUIA;
        //    operacion.guia = this.guia;

        //    // Instanciando y ejecutando llamada al ServicioREST
        //    using (ConexionREST conexionREST = new ConexionREST())
        //    {
        //        contenidoXML = conexionREST.ejecutarOperacion(operacion);
        //    }

        //    // Obteniendo Objeto de Error
        //    OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

        //    // Validar si hay error
        //    if (operacionError != null)
        //    {
        //        Util.ShowMessageboxError(operacionError.descripcion);
        //        return;
        //    }

        //    OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

        //    if ((operacionResultado != null) &&
        //        (operacionResultado.esOK.Equals(Constantes.NO)))
        //    {
        //        //grabar guia
        //        guardarGuia();
        //    }

        //}

        //private void grabarBulto()
        //{
        //    Operacion operacion = null;
        //    ListaLineaGuiaBulto listaLineaGuiaBulto = null;
        //    string contenidoXML = string.Empty;
        //    try
        //    {
        //        // Grabar Bulto

        //        // Estableciendo operacion a ser enviada al Servicio REST
        //        operacion = new Operacion();
        //        operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_DETALLEBULTO;
        //        operacion.guia = this.guia;

        //        // Instanciando lista de linea de bultos
        //        listaLineaGuiaBulto = new ListaLineaGuiaBulto();
        //        foreach (Bulto bulto in this.listaBulto.lista)
        //        {
        //            bulto.codGuia = this.guia.codGuia;
        //            listaLineaGuiaBulto.add(new LineaGuiaBulto { codGuia = this.guia.codGuia, bulto = bulto });
        //        }

        //        // Estableciendo lista de linea guia bulto
        //        operacion.guia.listaLineaGuiaBulto = listaLineaGuiaBulto;

        //        // Instanciando y ejecutando llamada al ServicioREST
        //        using (ConexionREST conexionREST = new ConexionREST())
        //        {
        //            contenidoXML = conexionREST.ejecutarOperacion(operacion);
        //        }

        //        // Obteniendo Objeto de Error
        //        OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

        //        // Validar si hay error
        //        if (operacionError != null)
        //        {
        //            Util.ShowMessageboxError(operacionError.descripcion);
        //            return;
        //        }

        //        OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

        //        if ((operacionResultado != null) &&
        //            (operacionResultado.esOK.Equals(Constantes.SI)))
        //        {
        //            //Graba linea detalle
        //            //grabaGuiaDetalle();
        //        }
        //        else
        //        {
        //            Util.ShowMessageboxError("No se guardo los datos");
        //            return;
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        Util.MensajeError(ex, this.Text);
        //    }
        //    finally
        //    {
        //        Cursor.Current = Cursors.Default;
        //    }
        //}

       

        #endregion

        #endregion
    }
}